package mis.core.dao;

import java.io.Serializable;
import java.math.BigInteger;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;

/**
 * 基础数据库操作类
 * 其他DAO继承此类获取常用的数据库操作方法
 * @author DCJ
 * @param <T>
 *            模型
 */
public interface BaseDao<T> {

	/**
	 * 保存一个对象
	 * 
	 * @param o
	 *            对象
	 * @return 对象的ID
	 */
	public Serializable save(T o);

	/**
	 * 删除一个对象
	 * 
	 * @param o
	 *            对象
	 */
	public void delete(T o);
	
	/**
	 * 更新一个对象
	 * 
	 * @param o
	 *            对象
	 */
	public void update(T o);

	/**
	 * 保存或更新一个对象
	 * 
	 * @param o
	 *            对象
	 */
	public void saveOrUpdate(T o);

	/**
	 * 通过主键获得对象
	 * 
	 * @param c
	 *            类名.class
	 * @param id
	 *            主键
	 * @return 对象
	 */
	public T getById(Class<T> c, Serializable id);

	/**
	 * 通过HQL语句获取一个对象
	 * 
	 * @param hql
	 *            HQL语句
	 * @return 对象
	 */
	public T getByHql(String hql);

	/**
	 * 通过HQL语句获取一个对象
	 * 
	 * @param hql
	 *            HQL语句
	 * @param params
	 *            参数
	 * @return 对象
	 */
	public T getByHql(String hql, Map<String, Object> params);

	/**
	 * 获得对象列表
	 * 
	 * @param hql
	 *            HQL语句
	 * @return List
	 */
	public List<T> find(String hql);

	/**
	 * 获得对象列表
	 * 
	 * @param hql
	 *            HQL语句
	 * @param params
	 *            参数
	 * @return List
	 */
	public List<T> find(String hql, Map<String, Object> params);

	/**
	 * 获得分页后的对象列表
	 * 
	 * @param hql
	 *            HQL语句
	 * @param page
	 *            要显示第几页
	 * @param rows
	 *            每页显示多少条
	 * @return List
	 */
	public List<T> find(String hql, int page, int rows);

	/**
	 * 获得分页后的对象列表
	 * 
	 * @param hql
	 *            HQL语句
	 * @param params
	 *            参数
	 * @param page
	 *            要显示第几页
	 * @param rows
	 *            每页显示多少条
	 * @return List
	 */
	public List<T> find(String hql, Map<String, Object> params, int page, int rows);

	/**
	 * 统计数目
	 * 
	 * @param hql
	 *            HQL语句(select count(*) from T)
	 * @return long
	 */
	public Long count(String hql);

	/**
	 * 统计数目
	 * 
	 * @param hql
	 *            HQL语句(select count(*) from T where xx = :xx)
	 * @param params
	 *            参数
	 * @return long
	 */
	public Long count(String hql, Map<String, Object> params);

	/**
	 * 执行一条HQL语句
	 * 
	 * @param hql
	 *            HQL语句
	 * @return 响应结果数目
	 */
	public int executeHql(String hql);

	/**
	 * 执行一条HQL语句
	 * 
	 * @param hql
	 *            HQL语句
	 * @param params
	 *            参数
	 * @return 响应结果数目
	 */
	public int executeHql(String hql, Map<String, Object> params);

	/**
	 * 获得结果集
	 * 
	 * @param sql
	 *            SQL语句
	 * @return 结果集
	 */
	public List<Map> findBySql(String sql);

	/**
	 * 获得结果集
	 * 
	 * @param sql
	 *            SQL语句
	 * @param page
	 *            要显示第几页
	 * @param rows
	 *            每页显示多少条
	 * @return 结果集
	 */
	public List<Map> findBySql(String sql, int page, int rows);

	/**
	 * 获得结果集
	 * 
	 * @param sql
	 *            SQL语句
	 * @param params
	 *            参数
	 * @return 结果集
	 */
	public List<Map> findBySql(String sql, Map<String, Object> params);

	/**
	 * 获得结果集
	 * 
	 * @param sql
	 *            SQL语句
	 * @param params
	 *            参数
	 * @param page
	 *            要显示第几页
	 * @param rows
	 *            每页显示多少条
	 * @return 结果集
	 */
	public List<Map> findBySql(String sql, Map<String, Object> params, int page, int rows);

	/**
	 * 执行SQL语句
	 * 
	 * @param sql
	 *            SQL语句
	 * @return 响应行数
	 */
	public int executeSql(String sql);

	/**
	 * 执行SQL语句
	 * 
	 * @param sql
	 *            SQL语句
	 * @param params
	 *            参数
	 * @return 响应行数
	 */
	public int executeSql(String sql, Map<String, Object> params);

	/**
	 * 统计
	 * 
	 * @param sql
	 *            SQL语句
	 * @return 数目
	 */
	public BigInteger countBySql(String sql);

	/**
	 * 统计
	 * 
	 * @param sql
	 *            SQL语句
	 * @param params
	 *            参数
	 * @return 数目
	 */
	public BigInteger countBySql(String sql, Map<String, Object> params);
	/**
	 * 创建Criteria实例
	 * 
	 * @return criteria
	 */
	public Criteria createCriteria();
	
	/**
	 * 根据Criterion条件创建Criteria
	 * 
	 * @param criterions
	 * @return criteria
	 */
	public Criteria createCriteria(Criterion... criterions); 
	
	/**
	 * 获得结果集
	 * 
	 * @param criteria
	 * @return 结果集
	 */
	public List<T> findByCriteria(Criteria criteria);
	
	/**
	 * 获得结果集
	 * @param criterions
	 * @return 结果集
	 */
	public List<T> findByCriteria(Criterion... criterions);
	
	/**
	 * 统计结果集数量
	 * 
	 * @param criteria
	 * @return int
	 */
	public int countAll(Criteria criteria);
	/**
	 * 获得对象
	 * @param criteria
	 * @return
	 */
	public T get(Criteria criteria) ;
	/**
	 * 分页获得结果集
	 * 
	 * @param criteria
	 * @param page
	 * @param rows
	 * @return 对象
	 */
	public List<T> findByCriteria(Criteria criteria, int page, int rows);
	/**
	 * 查询所有对象并分页
	 * 
	 * @param page
	 * @param rows
	 * @return 结果集
	 */
	public List<T> findAll(int page, int rows);
	
	/**
	 * 获得所有对象并排序
	 * 
	 * @param orderBy
	 * @param isAsc
	 * @return 结果集
	 */
	public List<T> findAll(String sort, String order);
	
	/** 查询所有对象分页排序
	 * @param page
	 * @param rows
	 * @param orderBy
	 * @param isAsc
	 * @return
	 */
	public List<T> findAll(int page, int rows, String sort, String order);
	
	/**
	 * 根据属性查询对象，匹配方式相等
	 * 
	 * @param propertyName
	 * @param value
	 * @return
	 */
	public T getByProperty(String propertyName, Object value);
	
	/**根据书讯查询结果集
	 * 
	 * @param propertyName
	 * @param value
	 * @return
	 */
	public List<T> findByProperty(String propertyName, Object value);
	
	/**
	 * 判断唯一性约束字段值是否已存在
	 * @param propertyName
	 * @param value
	 * @return
	 */
	public boolean isExist(String propertyName, Object value);
	/**
	 * 找到所有对象
	 * 
	 * @return List
	 */
	public List<T> findAll();
	/**
	 * 根据主键删除对象
	 * 
	 */
	public void deleteById(Serializable id);
	/**
	 * 批量删除
	 * 
	 * 
	 * @param entities
	 */
	public void deleteAll(Collection<?> entities);
	/**
	 * 统计所有
	 * 
	 * @return int
	 */
	public int countAll();
	/**
	 * 通过主键获得对象
	 * 
	 * @param id
	 *            主键
	 * @return 对象
	 */
	public T get(Serializable id);

}
